#include "board.h"
#include "main.h"
#include "gpio.h"
#include "bsp_radio_tx.h"
#include "adc6140.h"

/* 数码管显示buff 0-9 */
static uint8_t digital_buff[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
static adc6140_handle_t adc1_dev = NULL;
static uint8_t adc6140_dev_status = 0;

void bsp_board_init(void)
{
    /* adc6140 */
    adc1_dev = adc6140_create(&hspi2, SPI2_CS_GPIO_Port, SPI2_CS_Pin);
    adc6140_dev_status = TLV320ADC6140_Init(adc1_dev);

    /* lmx2572 */
    bsp_radio_tx_init();
}

/* 获取adc6140设备状态 */
uint8_t bsp_adc6140_dev_get_status(void)
{
    return adc6140_dev_status;
}

/* 数字显示 0-9 */
static void digital_display(uint8_t digital)
{
    uint8_t level = 0;
    uint8_t value = 0;

    if (digital > 9)
    {
        printf(" digital_display : %d > 9 fail !!! \r\n", digital);
        return;
    }

    /* 获取数码管显示buff */
    value = digital_buff[digital];

    /* 逐个点亮二极管 */
    // for (uint8_t i = 0; i < 7; i++)
    // {
    //     level = (value & (1 << i)) >> i;
    //     gpio_set_level(digital_led_buff[i], level);
    // }
    HAL_GPIO_WritePin(AA_GPIO_Port, AA_Pin, (value & (1 << 0)) >> 0);
    HAL_GPIO_WritePin(BB_GPIO_Port, BB_Pin, (value & (1 << 1)) >> 1);
    HAL_GPIO_WritePin(CC_GPIO_Port, CC_Pin, (value & (1 << 2)) >> 2);
    HAL_GPIO_WritePin(DD_GPIO_Port, DD_Pin, (value & (1 << 3)) >> 3);
    HAL_GPIO_WritePin(EE_GPIO_Port, EE_Pin, (value & (1 << 4)) >> 4);
    HAL_GPIO_WritePin(FF_GPIO_Port, FF_Pin, (value & (1 << 5)) >> 5);
    HAL_GPIO_WritePin(GG_GPIO_Port, GG_Pin, (value & (1 << 6)) >> 6);
}

/* 数码管不显示 */
static void digital_not_display(void)
{
    /* 逐个熄灭二极管 */
    // for (uint8_t i = 0; i < 7; i++)
    // {
    //     gpio_set_level(digital_led_buff[i], 0);
    // }
    HAL_GPIO_WritePin(AA_GPIO_Port, AA_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(BB_GPIO_Port, BB_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(CC_GPIO_Port, CC_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(DD_GPIO_Port, DD_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(EE_GPIO_Port, EE_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(FF_GPIO_Port, FF_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GG_GPIO_Port, GG_Pin, GPIO_PIN_RESET);
}

/* 数码管告警显示 */
static void alarm_display(void)
{
    uint8_t value = 0;
    uint8_t level = 0;

    /* 获取数码管显示 */
    value = 0x40;

    /* 逐个点亮二极管 */
    // for (uint8_t i = 0; i < 7; i++)
    // {
    //     level = (value & (1 << i)) >> i;
    //     gpio_set_level(digital_led_buff[i], level);
    // }
    HAL_GPIO_WritePin(AA_GPIO_Port, AA_Pin, (value & (1 << 0)) >> 0);
    HAL_GPIO_WritePin(BB_GPIO_Port, BB_Pin, (value & (1 << 1)) >> 1);
    HAL_GPIO_WritePin(CC_GPIO_Port, CC_Pin, (value & (1 << 2)) >> 2);
    HAL_GPIO_WritePin(DD_GPIO_Port, DD_Pin, (value & (1 << 3)) >> 3);
    HAL_GPIO_WritePin(EE_GPIO_Port, EE_Pin, (value & (1 << 4)) >> 4);
    HAL_GPIO_WritePin(FF_GPIO_Port, FF_Pin, (value & (1 << 5)) >> 5);
    HAL_GPIO_WritePin(GG_GPIO_Port, GG_Pin, (value & (1 << 6)) >> 6);
}

/* 按数字全部显示 */
void all_display_digital(uint16_t digital)
{
    uint16_t tmp = 0;
    uint16_t value = 0;

    value = digital;

    /* tmp个位数 */
    tmp = value % 10;
    HAL_GPIO_WritePin(GD4_GPIO_Port, GD4_Pin, GPIO_PIN_RESET);
    digital_display(tmp);
    HAL_GPIO_WritePin(DP_GPIO_Port, DP_Pin, GPIO_PIN_RESET);
    osDelay(1);
    HAL_GPIO_WritePin(GD4_GPIO_Port, GD4_Pin, GPIO_PIN_SET);

    /* tmp十位数 */
    tmp = (value / 10) % 10;
    HAL_GPIO_WritePin(GD3_GPIO_Port, GD3_Pin, GPIO_PIN_RESET);
    digital_display(tmp);
    HAL_GPIO_WritePin(DP_GPIO_Port, DP_Pin, GPIO_PIN_SET);
    osDelay(1);
    HAL_GPIO_WritePin(GD3_GPIO_Port, GD3_Pin, GPIO_PIN_SET);

    /* tmp百位数 */
    tmp = (value / 100) % 10;
    HAL_GPIO_WritePin(GD2_GPIO_Port, GD2_Pin, GPIO_PIN_RESET);
    if (0 == tmp)
    {
        digital_not_display(); // 为0时不显示
    }
    else
    {
        digital_display(tmp);
    }
    HAL_GPIO_WritePin(DP_GPIO_Port, DP_Pin, GPIO_PIN_RESET);
    osDelay(1);
    HAL_GPIO_WritePin(GD2_GPIO_Port, GD2_Pin, GPIO_PIN_SET);

    /* tmp千位数 */
    tmp = (value / 1000) % 10;
    HAL_GPIO_WritePin(GD1_GPIO_Port, GD1_Pin, GPIO_PIN_RESET);
    if (0 == tmp)
    {
        digital_not_display(); // 最高位为0时不显示
    }
    else
    {
        digital_display(tmp);
    }
    HAL_GPIO_WritePin(DP_GPIO_Port, DP_Pin, GPIO_PIN_RESET);
    osDelay(1);
    HAL_GPIO_WritePin(GD1_GPIO_Port, GD1_Pin, GPIO_PIN_SET);
}

/* 显示正负数值 */
void all_display_digital_signed(int16_t digital)
{
    uint16_t tmp = 0;
    uint16_t value = 0;

    value = abs(digital);

    /* tmp个位数 */
    tmp = value % 10;
    HAL_GPIO_WritePin(GD4_GPIO_Port, GD4_Pin, GPIO_PIN_RESET);
    digital_display(tmp);
    HAL_GPIO_WritePin(DP_GPIO_Port, DP_Pin, GPIO_PIN_RESET);
    osDelay(1);
    HAL_GPIO_WritePin(GD4_GPIO_Port, GD4_Pin, GPIO_PIN_SET);

    /* tmp十位数 */
    tmp = (value / 10) % 10;
    HAL_GPIO_WritePin(GD3_GPIO_Port, GD3_Pin, GPIO_PIN_RESET);
    if (0 == tmp && value < 10)
    {
        digital_not_display(); // 为0时不显示
    }
    else
    {
        digital_display(tmp);
    }
    HAL_GPIO_WritePin(DP_GPIO_Port, DP_Pin, GPIO_PIN_RESET);
    osDelay(1);
    HAL_GPIO_WritePin(GD3_GPIO_Port, GD3_Pin, GPIO_PIN_SET);

    /* tmp百位数 */
    tmp = (value / 100) % 10;
    HAL_GPIO_WritePin(GD2_GPIO_Port, GD2_Pin, GPIO_PIN_RESET);
    if (0 == tmp && value < 100)
    {
        digital_not_display(); // 为0时不显示
    }
    else
    {
        digital_display(tmp);
    }
    HAL_GPIO_WritePin(DP_GPIO_Port, DP_Pin, GPIO_PIN_RESET);
    osDelay(1);
    HAL_GPIO_WritePin(GD2_GPIO_Port, GD2_Pin, GPIO_PIN_SET);

    /* tmp千位数 */
    // tmp = (value / 1000) % 10;
    HAL_GPIO_WritePin(GD1_GPIO_Port, GD1_Pin, GPIO_PIN_RESET);
    if (digital >= 0)
    {
        digital_not_display(); // 最高位为0时不显示
    }
    else
    {
        alarm_display();
    }
    HAL_GPIO_WritePin(DP_GPIO_Port, DP_Pin, GPIO_PIN_RESET);
    osDelay(1);
    HAL_GPIO_WritePin(GD1_GPIO_Port, GD1_Pin, GPIO_PIN_SET);
}